"use strict";
/*
    TypeScript 运算符
 */
/**
 * 算术运算符
 * +, -, *, /, %, ++, --
 */
var num1 = 10;
var num2 = 2;
var res = 0;
res = num1 + num2;
console.log("加:  " + res);
res = num1 - num2;
console.log("减: " + res);
res = num1 * num2;
console.log("乘: " + res);
res = num1 / num2;
console.log("除: " + res);
res = num1 % num2;
console.log("余数: " + res);
num1++;
console.log("num1 自增运算: " + num1);
num2--;
console.log("num2 自减运算: " + num2);
/**
 * 关系运算符
 * 关系运算符用于计算结果是否为 true 或者 false。
 * ==, !=, >, <, >=, <=
 */
var num3 = 5;
var num4 = 9;
console.log("num1 的值为: " + num3);
console.log("num2 的值为:" + num4);
var res2 = num3 > num4;
console.log("num3 大于n num4: " + res2);
res2 = num3 < num4;
console.log("num3 小于 num4: " + res2);
res2 = num3 >= num4;
console.log("num3 大于或等于  num4: " + res2);
res2 = num3 <= num4;
console.log("num3 小于或等于 num4: " + res2);
res2 = num3 == num4;
console.log("num3 等于 num4: " + res2);
res2 = num3 != num4;
console.log("num3 不等于 num4: " + res2);
/**
 * 逻辑运算符
 * 逻辑运算符用于测定变量或值之间的逻辑。
 * &&, ||, !
 */
var avg = 20;
var percentage = 90;
console.log("avg 值为: " + avg + " ,percentage 值为: " + percentage);
var res3 = ((avg > 50) && (percentage > 80));
console.log("(avg>50)&&(percentage>80): ", res3);
var res4 = ((avg > 50) || (percentage > 80));
console.log("(avg>50)||(percentage>80): ", res4);
var res5 = !((avg > 50) && (percentage > 80));
console.log("!((avg>50)&&(percentage>80)): ", res5);
/**
 * 位运算符
 * 位操作是程序设计中对位模式按位或二进制数的一元和二元操作。
 *      &: AND，按位与处理两个长度相同的二进制数，两个相应的二进位都为 1，该位的结果值才为 1，否则为 0。
 *      |: OR，按位或处理两个长度相同的二进制数，两个相应的二进位中只要有一个为 1，该位的结果值为 1。
 *      ~: 取反，取反是一元运算符，对一个二进制数的每一位执行逻辑反操作。使数字 1 成为 0，0 成为 1。
 *      ^: 异或，按位异或运算，对等长二进制模式按位或二进制数的每一位执行逻辑异按位或操作。操作的结果是如果某位不同则该位为 1，否则该位为 0。
 *      <<: 左移，把 << 左边的运算数的各二进位全部左移若干位，由 << 右边的数指定移动的位数，高位丢弃，低位补 0。
 *      >>: 右移，把 >> 左边的运算数的各二进位全部右移若干位，>> 右边的数指定移动的位数。
 *      >>>: 无符号右移，与有符号右移位类似，除了左边一律使用0 补位。
 */
var a = 2; // 二进制 10
var b = 3; // 二进制 11
var result;
result = (a & b);
console.log("(a & b) => ", result);
result = (a | b);
console.log("(a | b) => ", result);
result = (a ^ b);
console.log("(a ^ b) => ", result);
result = (~b);
console.log("(~b) => ", result);
result = (a << b);
console.log("(a << b) => ", result);
result = (a >> b);
console.log("(a >> b) => ", result);
result = (a >>> 1);
console.log("(a >>> 1) => ", result);
/**
 * 赋值运算符
 * 赋值运算符用于给变量赋值。
 * =, +=, -=, *=, /=。
 * 类似的逻辑运算符也可以与赋值运算符联合使用：<<=, >>=, >>=, &=, |= 与 ^=。
 */
var a = 12;
var b = 10;
a = b;
console.log("a = b: " + a);
a += b;
console.log("a+=b: " + a);
a -= b;
console.log("a-=b: " + a);
a *= b;
console.log("a*=b: " + a);
a /= b;
console.log("a/=b: " + a);
a %= b;
console.log("a%=b: " + a);
/**
 * 三元运算符 (? : )
 * 三元运算有 3 个操作数，并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
 */
var num = -2;
var result2 = num > 0 ? "大于 0" : "小于 0，或等于 0";
console.log(result2);
/**
 * 类型运算符
 *      typeof 运算符,是一元运算符，返回操作数的数据类型。
 *      instanceof 运算符用于判断对象是否为指定的类型
 */
var num = 12;
console.log(typeof num); //输出结果: number
class A {
}
class B {
}
var a_ = new A();
console.log(a_ instanceof A); // true
console.log(a_ instanceof B); //false
/**
 * 其他运算符
 *      负号运算符(-):更改操作数的符号
 *      字符串运算符: 连接运算符 (+): + 运算符可以拼接两个字符串
 */
var x = 4;
var y = -x;
console.log("x 值为: ", x); // 输出结果 4
console.log("y 值为: ", y); // 输出结果 -4
var msg = "ryan" + "liu";
console.log(msg);
